4119
7808
java.nio.ByteBuffer aを(新しく作成された)CharBufferbまたはchar [] bに変換する最速の方法は何ですか。
これを行うことにより、a [i] == b [i]であることが重要です。これは、a [i]とa [i +1]が一緒に値b [j]を構成するのではなく、getChar(i)が行うことを意味しますが、値は「拡散」する必要があります。
バイトa [] = {1,2,3、125,126,127、-128、-127、-126} //各バイト(符号付き)
char b [] = {1,2,3、125,126,127、128、129、130} //各char(符号なし)
byte:-128はchar:128と同じ(下位8)ビットであることに注意してください。したがって、ビットが同じであるため、「最良の」解釈は上記のとおりであると思います。
その後、その逆の変換も必要です。char[]またはjava.nio.CharBufferをjava.nio.ByteBufferに戻す最も効率的な方法です。 
したがって、必要なのは、エンコーディングISO-8859-1を使用して変換することです。
私は効率について何も主張しませんが、少なくとも書くのはかなり短いです:
CharBufferの結果= Charset.forName( "ISO-8859-1")。decode(byteBuffer);
他の方向は次のようになります。
ByteBufferの結果= Charset.forName( "ISO-8859-1")。encode(charBuffer);
これを他のソリューションと比較して測定してください。 (公平を期すために、Charset.forNameの部分は含めないでください。また、バッファーごとではなく、一度だけ実行する必要があります。)
Java 7以降には、事前にインスタンス化されたCharsetインスタンスを持つStandardCharsetsクラスもあるため、次を使用できます。
CharBufferの結果= StandardCharsets.ISO_8859_1.decode(byteBuffer);
そして
ByteBufferの結果= StandardCharsets.ISO_8859_1.encode(charBuffer);
代わりに。 (これらの行は以前の行と同じですが、検索が簡単で、名前を誤って入力するリスクがなく、不可能な例外をキャッチする必要がありません。)
|
私は@Ishtarに同意し、新しい構造への変換をまったく避け、必要な場合にのみ変換することを提案します。
ただし、ヒープByteBufferがある場合は、それを実行できます。
ByteBuffer bb =..。
byte [] array = bb.array();
char [] chars = new char [bb.remaining()];
for(int i = 0; i